﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AlgoritmosTA1
{
    public static class Constantes
    {
        public static char[] Abecedario = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };

        public static string Multiplicacion = "*";
        public static string Suma = "+";
        public static string Resta = "-";
        public static string Modulo = "%";
        public static string Division = "/";
        public static string Parentesis = "()";
        public static string ParentesisAbierto = "(";
        public static string ParentesisCerrado = ")";
        public static string Operacion = "=";

        public static bool EsOperador(string cad)
        {
            if (
                cad.Equals(Constantes.Division) ||
                cad.Equals(Constantes.Modulo) ||
                cad.Equals(Constantes.Multiplicacion) ||
                cad.Equals(Constantes.Parentesis) ||
                cad.Equals(Constantes.Suma) ||
                cad.Equals(Constantes.Resta)
                )
            {
                return true;
            }
            return false;
        }

        public static bool tieneOperador(string cadena)
        {
            for (int i = 0; i < cadena.Length; i++)
            {
                if (Constantes.EsOperador(cadena[i].ToString()))
                {
                    return true;
                }
            }
            return false;

        }

        public static int operadorMenor(string cadena)
        {
            int posicion = 0;
            int precMenor = 5;

            for (int i = 0; i < cadena.Length; i++)
            {
                if (Constantes.EsOperador(cadena[i].ToString()))
                {
                    int prec = Precedencia(cadena[i].ToString());
                    if (prec <= precMenor)
                    {
                        posicion = i;
                        precMenor = prec;
                    }
                }
            }


            return posicion;
        }

        public static int Precedencia(string cad)
        {
            int prec = 0;

            if (
                cad.Equals(Constantes.Parentesis) ||
                cad.Equals(Constantes.ParentesisAbierto) ||
                cad.Equals(Constantes.ParentesisCerrado)
                )
            {
                prec = 3;
            }
            else if (
                cad.Equals(Constantes.Division) ||
                cad.Equals(Constantes.Modulo) ||
                cad.Equals(Constantes.Multiplicacion)
                )
            {
                prec = 2;
            }
            else if (
                cad.Equals(Constantes.Suma) ||
                cad.Equals(Constantes.Resta)
                )
            {
                prec = 1;
            }

            return prec;
        }

        public static bool CadenaValida(string cad)
        {
            string anterior;

            if (cad != null){
                if (Constantes.EsOperador(Convert.ToString(cad[0])))
                {
                    return false;
                }
                else if (Constantes.EsOperador(Convert.ToString(cad[cad.Length-1])))
                {
                }
                else
                {
                    for (int i = 1; i < cad.Length; i++)
                    {
                        anterior = Convert.ToString(cad[i - 1]);
                        if (Constantes.EsOperador(anterior) && (Constantes.EsOperador(Convert.ToString(cad[i]))))
                        {
                            return false;
                        }

                    }

                    return true;
                }
            }            

            return false;
        }

        public static void NormalizarCadena(string cad)
        {
            cad = cad.Replace(" ", string.Empty);
        }

        public static void GetIndexes(string cad){
        
        }

        public static double Evaluate(string expression)
        {
            var loDataTable = new DataTable();
            var loDataColumn = new DataColumn("Eval", typeof(double), expression);
            loDataTable.Columns.Add(loDataColumn);
            loDataTable.Rows.Add(0);
            return (double)(loDataTable.Rows[0]["Eval"]);
        }

        public static string[] SepararCadena(string cad)
        {
            string[] r = new string[3];

            int cont = 1;
            int i = 0;
            if (cad[0] == '(')
            {
                while (cont > 0)
                {
                    i++;
                    if (cad[i] == '(') cont++;
                    else if (cad[i] == ')') cont--;

                }
                r[0] = cad.Substring(1, i - 1);

                i++;
                if (i != cad.Length)
                {
                    r[1] = cad.Substring(i, 1);
                    i++;
                    r[2] = cad.Substring(i, cad.Length - i);
                }
                else
                {
                    r[1] = null;
                    r[2] = null;
                }
                
            }
            return r;
        }

        public static string[] SepararCadenaPosicion(string cad, int pos)
        {
            string[] r = new string[3];

            r[0] = cad.Substring(0, pos);
            r[1] = cad.Substring(pos, 1);
            r[2] = cad.Substring(pos + 1, cad.Length - pos - 1);

            return r;
        }

    }
}
